const Subscription = require('egg').Subscription,
  redisKey = require('../utils/redis_key'),
  moment = require('moment');

class DailyLimitTask extends Subscription {
  // 通过 schedule 属性来设置定时任务的执行间隔等配置
  static get schedule() {
    return {
      // interval: '3m', // 1 分钟间隔
      // type: 'all', // 指定所有的 worker 都需要执行
      cron: '0 0 0 * * *',
      type: 'all',
    };
  }

  // subscribe 是真正定时任务执行时被运行的函数
  async subscribe() {
    const campaigns = await this.ctx.app.model.Campaign.find();
    const promises = campaigns.map(item => {
      return async function() {
        const rediskeyRateLimit = redisKey.rateLimit(item._id);
        await this.ctx.app.redis.set(rediskeyRateLimit, parseFloat(item.daily_limit.toFixed(2)));
        const end = Math.floor(new Date(moment().add(1, 'days').format('YYYY-MM-DD 00:00:00')).getTime() / 1000);
        await this.ctx.app.redis.expireat(rediskeyRateLimit, end); // 重新设置ttl
      }.call(this);
    });

    await Promise.all(promises);
  }
}

module.exports = DailyLimitTask;
